//
//  HomeTableViewController.swift
//  TWeibo
//
//  Created by wtw on 15/7/28.
//  Copyright © 2015年 wtw. All rights reserved.
//

import UIKit

class HomeTableViewController: BaseViewController {
    
    //微博数据数组
    var statuses: [Status]? {
        didSet {
            //刷新数据
            tableView.reloadData()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 如果用户没有登录，设置访客视图，返回
        if !UserAcount.userLogon {
            visitorView?.setupInfo(true, imageName: "visitordiscover_feed_image_smallicon", Message: "关注一些人，回这里看看有什么惊喜")
            return
        }
        
        prepareTableView()
        //顺序反了进入界面的刷新不会显示
        loadData()
        
    }
    
    //准备表格数据
    private func prepareTableView() {
        //注册原型cell
        tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: StatusCellIndentifier.NormolCell.rawValue)
        tableView.registerClass(StatusForwardCell.self, forCellReuseIdentifier: StatusCellIndentifier.ForwardCell.rawValue)
        
        //设置表格的预估行高，使用预估行高且使用底部约束的时候会出现约束错误，尽量准确能够提高性能
        //能够减少调用行高的次数
        tableView.estimatedRowHeight = 300
        //设置表格自动计算行高
        //        tableView.rowHeight = UITableViewAutomaticDimension
        //如果不使用自动计算行高UITableViewAutomaticDimension，就不需要使用底部约束
        
        //取消分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        
        /// 创建刷新控件 refreshControl
        refreshControl = TWUIRefreshControl()
        /// 添加监听
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        
    }
    //上拉刷新的标记
    private var pullupRefreshFlag = false
    
    /// 加载数据
    func loadData() {
        //开始刷新，只是开启了刷新控件的动画，并不会触发加载数据的方法
        refreshControl?.beginRefreshing()
        
        //刷新新数据,获取数组中第一条记录的id
        //第一次执行此方法的时候，statuses为空，sin ce_id = 0,加载最新的20条数据
        var since_id = statuses?.first?.id ?? 0
        
        //判断是否上拉刷新
        var max_id = 0
        if pullupRefreshFlag {
            //让上拉刷新的数据改为0
            since_id = 0
            //记录数组最后一条记录的id
            max_id = statuses?.last?.id ?? 0
        }
        
        Status.loadStatus(since_id,max_id: max_id) {(dataList, error) -> () in
            //加载数据完毕后关闭刷新控件，结束刷新动画
            self.refreshControl?.endRefreshing()
            
            if error != nil {
                print(error)
                return
            }
            
            let count = dataList?.count ?? 0
            print("刷新到 \(count) 条数据")
            //只有下拉刷新才需要提示
            if since_id > 0 {
                self.showPulldownTip(count)
            }
            
            //如果没有数据直接返回
            if count == 0 {
                return
            }
            
            if since_id > 0 { //做下拉刷新,应该将结果结合拼接到之前数组的前面
                self.statuses = dataList! + self.statuses!
            }else if max_id > 0{ //做上拉刷新，应该将结果拼接到数组的后面
                self.statuses! += dataList!
                //复位上拉刷新标记，保证下一次仍然能够上拉
                self.pullupRefreshFlag = false
            }else {
                self.statuses = dataList
            }
        }
    }
    
    //显示下拉刷新的数据条数
    private func showPulldownTip(count: Int) {
        // uiview 的动画师对核心动画的封装，添加到 控件的 layer 上
        //块代码动画中，修改frame 本质上是修改的 position
        //判断动画是否正在执行
        print(tipLabel.layer.animationKeys())
        
        if tipLabel.layer.animationForKey("position") != nil {
           //如果用户两次下拉间隔非常短，‘通常‘是不会有新的微博的
            //即使是有微博，但是用户这样操作，也只会给一次提示
            print("动画正在执行")
            return
        }
            //标签的文字
            tipLabel.text = (count == 0) ? "暂时没有新的微博" : "刷新到 \(count) 条微博"
            //标签的初始位置
            let rect = tipLabel.frame
            UIView.animateWithDuration(2.0, animations: { () -> Void in
            //自动反转动画(动画怎么来然后怎么回去)
            UIView.setAnimationRepeatAutoreverses(true)
            //移动label的位置
            self.tipLabel.frame = CGRectOffset(rect, 0, 3 * rect.height)
            }) { (_) -> Void in
//                //完成后移除
//                tipLabel.removeFromSuperview()
                
                //将标签复位
                self.tipLabel.frame = rect
        }
    }
    
    //MARK: - 数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statuses?.count ?? 0
    }
    //每次要显示 cell 的时候，会调用此方法，根据 indexpath 判断数据方法
    //如果indexpath == 微博数组的总数 -1，表示要显示最后一行
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //根据微博类型选取不同类型的cell
        let status = statuses![indexPath.row]
        // 要求必须注册原型cell  ,StatusCell, 可以用storyboard或者register Class来创建
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellIndentifier.cellId(status), forIndexPath: indexPath) as! StatusCell
        
        //判断indexpath的值
        if indexPath.row == statuses!.count - 1 {
        //设置上拉刷新的标记
            pullupRefreshFlag = true
            //刷新数据
            loadData()
        }
        
        cell.status = statuses![indexPath.row]
        
        return cell
    }
    
    //代理方法,返回行高 - 如果是固定的值，可以直接通过属性设置，效率更高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        //1.获取cell  dequeueReusableCellWithIdentifier带 indexPath 的函数会调用计算行高的方法
        //会照成死循环，在不同的版本中，行高的计算次数是不一样的 ，尽量优化，如果不做处理会非常消耗性能
        // let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? StatusCell
        
        /*
        直接利用‘微博模型’  行高数据只是一个小数，并不会有太大的内存消耗,不需要在控制器中定义额外的属性
        注意：如果表格高度是固定的，一定不要通过代理来返回行高，可以直接设置属性
        */
        //判断模型中，是否已经缓存了行高
        //1.获取模型
        let status = statuses![indexPath.row]
        
        if let h = status.rowHeight {
            //print("返回缓存行高")
            return h
        }
        // print("计算行高")
        
        //2.
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellIndentifier.cellId(status)) as? StatusCell
        
        //3.计录并返回计算的行高
        
        status.rowHeight = cell!.rowHeight(status)
        return status.rowHeight!
    }
    
    // MARK: - 懒加载控件
    private lazy var tipLabel: UILabel = {
        
        //定义标签
        let h: CGFloat = 44
        let label = UILabel(frame: CGRect(x: 0, y:-2 * h, width: self.view.bounds.width, height: h))
        label.backgroundColor = UIColor.orangeColor()
        label.textColor = UIColor.whiteColor()
        label.textAlignment = NSTextAlignment.Center
        
        //将label添加到界面 view不合适，会一起滚动
        //加到 navbar 上面，不会随着 tableview 一起滚动（小技巧）
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        
        return label
    }()
}
